/*
 * Imprimir.java
 *
 * Created on 15 de abril de 2007, 12:44 AM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */
package administrador;

import java.awt.*;
import java.awt.print.*;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.math.RoundingMode;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Date;
import java.util.StringTokenizer;
import javax.print.*;
import javax.print.attribute.DocAttributeSet;
import javax.print.attribute.HashDocAttributeSet;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;

/**
 *
 * @author daniel1
 */
public class Imprimir {

    Archivo facturaTXT;
    String archNom;
    String num_Fact;
    //Datos del Cliente:
    String ClienteRucCI = "";
    String ClienteNom = "";
    String ClienteTlf = "";
    String ClienteDir = "";
    //Tipo de Documento:
    String documento;
    //Informacion de la Empresa
    String NombreRS = "";
    String RucEmisor = "";
    String DireccionLocal = "";
    String AutSRI = "";
    String FechaCaducidad = "";
    String NombreDueno = "";
    String codEmpresa = "";
    String codTerminale = "";

    String texto="";

    //Mensaje de Promocion:
    String mesajePromocion="";

    /** Creates a new instance of Imprimir */
    public Imprimir(String numFact, String ClienteRucCI, String ClienteNom, String ClienteTlf, String ClienteDir, String documento) {
    }

    NumberFormat nf = NumberFormat.getNumberInstance();
    DecimalFormat dec=(DecimalFormat)nf;

    public Imprimir(String codEmpresa, String codTerminale, String numFact, String ClienteRucCI, String ClienteNom, String ClienteTlf, String ClienteDir, String documento, String NombreRS, String NombreDueno, String RucEmisor, String DireccionLocal, String AutSRI, String FechaCaducidad) {
        //Defino tipo de Documento:
        dec.applyPattern("###.##");
        nf.setMaximumFractionDigits(2);
        nf.setRoundingMode(RoundingMode.HALF_UP);
        
        this.documento = documento;

        //Defino Parametros Factura y Datos del Cliente
        this.ClienteRucCI = ClienteRucCI;
        this.ClienteNom = ClienteNom;
        this.ClienteTlf = ClienteTlf;
        this.ClienteDir = ClienteDir;

        this.num_Fact = numFact;

        //Informacion de la  empresa
        this.NombreRS = "                " + NombreRS + "\n" +
                "         " + NombreDueno + "    ";
        this.RucEmisor = RucEmisor;
        this.DireccionLocal = DireccionLocal;
        this.AutSRI = AutSRI;
        this.FechaCaducidad = FechaCaducidad;
        this.NombreDueno = NombreDueno;
        this.codEmpresa = codEmpresa;
        this.codTerminale = codTerminale;
        //Defino el archivo e inserto la cabecera de la Factura a Imprimir:
        facturaTXT = new Archivo();
        archNom = "facturas/" + documento + "_" + numFact + ".txt";
        facturaTXT.crearArchivo(archNom);
        facturaTXT.escriboLineaArchivo(archNom, cabeceraFactura());
        texto=texto+cabeceraFactura();

    }
    
    
    //IMprime Reimpresion
    public Imprimir(String codEmpresa, String codTerminale, String numFact, String ClienteRucCI, String ClienteNom, String ClienteTlf, String ClienteDir, String documento, String NombreRS, String NombreDueno, String RucEmisor, String DireccionLocal, String AutSRI, String FechaCaducidad,String fechaEmision,String horaEmision) {
        //Defino tipo de Documento:
        dec.applyPattern("###.##");
        nf.setMaximumFractionDigits(2);
        nf.setRoundingMode(RoundingMode.HALF_UP);
        
        this.documento = documento;

        //Defino Parametros Factura y Datos del Cliente
        this.ClienteRucCI = ClienteRucCI;
        this.ClienteNom = ClienteNom;
        this.ClienteTlf = ClienteTlf;
        this.ClienteDir = ClienteDir;

        this.num_Fact = numFact;

        //Informacion de la  empresa
        this.NombreRS = "                " + NombreRS + "\n" +
                "         " + NombreDueno + "    ";
        this.RucEmisor = RucEmisor;
        this.DireccionLocal = DireccionLocal;
        this.AutSRI = AutSRI;
        this.FechaCaducidad = FechaCaducidad;
        this.NombreDueno = NombreDueno;
        this.codEmpresa = codEmpresa;
        this.codTerminale = codTerminale;
        //Defino el archivo e inserto la cabecera de la Factura a Imprimir:
        facturaTXT = new Archivo();
        archNom = "facturas/" + documento + "_" + numFact + ".txt";
        facturaTXT.crearArchivo(archNom);
        facturaTXT.escriboLineaArchivo(archNom, cabeceraFacturaReimpresion(fechaEmision,horaEmision));
        texto=texto+cabeceraFacturaReimpresion(fechaEmision,horaEmision);

    }
    
    
    public Imprimir(){
    
    
    }
    public void  imprimirSeparado(int numSeparado){
        facturaTXT = new Archivo();
        archNom = "facturas/AbonoSeparado_" + numSeparado + ".txt";
        facturaTXT.crearArchivo(archNom);
        documento="AbonoSeparado";

    }

    public void insertoDetImp(String codigoPro, String NombreImp, String cantProVendido, String precio, String subTot) {
        //Inserto en el archivo para la impresion:----------
        String tab1 = " ";
        if (NombreImp.length() > 11) {
            NombreImp = NombreImp.substring(0, 10);
        }
        if (NombreImp.length() > 5 && NombreImp.length() <= 10) {
            tab1 = "\t";
        } else if (NombreImp.length() < 5) {
            tab1 = "\t";
        }



        String tab2 = " ";
        if (codigoPro.length() <= 5) {
            tab2 = "\t";

        } else {
            tab2 = " ";
            tab1 = "";
        }
        String detalleImp = codigoPro + tab2 + NombreImp + tab1 + cantProVendido + "  " + precio + "  " + subTot;
        escriboFact(detalleImp);
    }

    public void escriboFact(String dataIns) {
       //System.out.println("Los datos a escribir son:" + dataIns);
        facturaTXT.escriboLineaArchivo(archNom, dataIns);
        texto=texto+dataIns+"\n";
    }

    public void realizaImprecion() {


        try {
            DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
            PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
            PrintService printService[] = PrintServiceLookup.lookupPrintServices(flavor, pras);

            PrintService service = printService[this.sacoImpresora(printService)];

            // Open the image file
            InputStream is = new BufferedInputStream(new FileInputStream(archNom));
            // Create the print job
            DocPrintJob job = service.createPrintJob();
            DocAttributeSet das = new HashDocAttributeSet();
            Doc doc = new SimpleDoc(is, flavor, das);

            // Monitor print job events
            PrintJobWatcher pjDone = new PrintJobWatcher(job);

            // Print it
            job.print(doc, pras);

            // Wait for the print job to be done
            pjDone.waitForDone();

            // It is now safe to close the input stream
            is.close();
        } catch (PrintException e) {
        } catch (IOException e) {
        }
    }
    public void realizaReImprecion(String path) {


        try {
            DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
            PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
            PrintService printService[] = PrintServiceLookup.lookupPrintServices(flavor, pras);

            PrintService service = printService[this.sacoImpresora(printService)];
            System.out.println("Impresora: "+service.getName());
            
            // Open the image file
            InputStream is = new BufferedInputStream(new FileInputStream(path));
            // Create the print job
            DocPrintJob job = service.createPrintJob();
            DocAttributeSet das = new HashDocAttributeSet();
            Doc doc = new SimpleDoc(is, flavor, das);

            // Monitor print job events
            PrintJobWatcher pjDone = new PrintJobWatcher(job);

            // Print it
            job.print(doc, pras);

            // Wait for the print job to be done
            pjDone.waitForDone();

            // It is now safe to close the input stream
            is.close();
        } catch (PrintException e) {
        } catch (IOException e) {
        }
    }


     public static void printString(final String text) {
        PageFormat pageFormat = new PageFormat();
        PrinterJob printerJob = PrinterJob.getPrinterJob();
        printerJob.setPrintable(new Printable() {

            public int print(Graphics graphics, PageFormat pageFormat,
                    int pageIndex) {
                Graphics2D graphics2D = (Graphics2D) graphics;
                graphics2D.translate(pageFormat.getImageableX(),
                        pageFormat.getImageableY());
                StringTokenizer stringTokenizer = new StringTokenizer(text, "\n\r");
                Font font = new Font("Times New Roman", Font.ROMAN_BASELINE, 12);
                graphics2D.setFont(font);
                int pageWidth = graphics2D.getClipBounds().width;
                FontMetrics fontMetrics =
                        graphics2D.getFontMetrics(font);
                int position = fontMetrics.getHeight();
                int height = fontMetrics.getAscent();
                while (stringTokenizer.hasMoreTokens()) {
                    String line = stringTokenizer.nextToken().trim();
                    int lineWidth = fontMetrics.stringWidth(line);
                    while (lineWidth > pageWidth) {
                        String lineCopy = line;
                        String firstPart = "";
                        while (lineWidth > pageWidth) {
                            int index = lineCopy.lastIndexOf(' ');
                            firstPart = lineCopy.substring(0, index);
                            lineWidth =
                                    fontMetrics.stringWidth(firstPart);
                            lineCopy = firstPart;
                        }
                        graphics2D.drawString(firstPart, 0, position);
                        position += height;
                        line = line.substring(firstPart.length(),
                                line.length()).trim();
                        lineWidth = fontMetrics.stringWidth(line);
                    }
                    graphics2D.drawString(line, 0, position);
                    position += height;
                }
                return (pageIndex == 0 ? PAGE_EXISTS : NO_SUCH_PAGE);
            }
        }, pageFormat);
        if (printerJob.printDialog()) {
            try {
                printerJob.print();
            } catch (Throwable throwable) {
                throwable.printStackTrace();
            }
        }

    }








    public int sacoImpresora(PrintService Impresoras[]) {
        //Busco la Impresora:
        int Epson = 0;
        int numb = 0;
        while (numb < Impresoras.length) {
            if (Impresoras[numb].getName().toString().toUpperCase().startsWith("EPSON")) {
                Epson = numb;
            }
            numb++;
        }
        return Epson;
    }

    public String cabeceraFactura() {
        Date now = new Date();
        //Defino la Cabeceras:
        //*********************Cabecera de Factura******************************
        String cabecera;
        String DenominacionDoc = "*";

       //System.out.println("El Documento a Imprimir es: " + documento);
        if (documento.equals("Factura")) {
            DenominacionDoc = "   FACTURA   ";
            DenominacionDoc = "DETALLE DE VENTA";
        }
        if (documento.equals("Separacion")) {
            DenominacionDoc = "   Separa   ";
            DenominacionDoc = "DETALLE DE SEPARADO";
        }
        if (documento.equals("Nota de Venta")) {
            DenominacionDoc = "NOTA DE VENTA";
        }
        if (documento.equals("Nota de Debito")) {
            DenominacionDoc = "NOTA DE DEBITO";
        }
        if (documento.equals("Nota de Credito")) {
            DenominacionDoc = "NOTA DE CREDITO";
            DenominacionDoc = "DEVOLUCION DE VENTA";
        }
        if (documento.equals("Factura de Compras")) {
            DenominacionDoc = "FACTURA DE COMPRAS";
            DenominacionDoc = "DETALLE DE COMPRA";
        }
        if (documento.equals("Devolucion en Compras")) {
            DenominacionDoc = "DEVOLUCION EN COMPRAS";
            DenominacionDoc = "DEVOLUCION DE COMPRA";
        }
        //genero los numeros de factura
        int contador = num_Fact.length();
        contador = 7 - contador;
        for (int i = 0; i < contador; i++) {
            num_Fact = "0" + num_Fact;
        }

        int contadorNE = codEmpresa.length();
        contadorNE = 3 - contadorNE;
        for (int i = 0; i < contadorNE; i++) {
            codEmpresa = "0" + codEmpresa;
        }

        int contadorNT = codTerminale.length();
        contadorNT = 3 - contadorNT;
        for (int i = 0; i < contadorNT; i++) {
            codTerminale = "0" + codTerminale;
        }
        //String codEmpresa,String codTerminale
        //String NumFactura="001-001-"+num_Fact;
        String NumFactura = codEmpresa + "-" + codTerminale + "-" + num_Fact;
        cabecera = "" + NombreRS + "\n" +
                "          Ruc:" + RucEmisor + "\n" +
                DireccionLocal + "\n" +
                "   AutSRI:" + AutSRI + " F.CAD:" + FechaCaducidad + "\n" +
                "            " + DenominacionDoc + "\n" +
                "         No.:" + NumFactura + "\n";

        //Para los locales Sexylocuras:
        cabecera= "            \n" +
                  "            " + DenominacionDoc + "\n" +
                  "         No.:" + NumFactura + "\n" +
                  "Emite:"+NombreRS+"\n" +
                  "Dir:"+DireccionLocal + "\n";

        //Datos del Cliente:

        String Fecha = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG).format(now);
        // String FormaPago="Contado";
        cabecera = cabecera +
                "Nom:" + ClienteNom + "\n" +
                "Dir:" + ClienteDir + "\n" +
                "Tlf.:" + ClienteTlf + "\n" +

                Fecha + " " + "";
        //############################
        
        
        return cabecera;
    }
    
    
    public String cabeceraFacturaReimpresion(String fecha,String hora) {
        Date now = new Date();
        //Defino la Cabeceras:
        //*********************Cabecera de Factura******************************
        String cabecera;
        String DenominacionDoc = "*";

       //System.out.println("El Documento a Imprimir es: " + documento);
        if (documento.equals("Factura")) {
            DenominacionDoc = "   FACTURA   ";
            DenominacionDoc = "DETALLE DE VENTA";
        }
        if (documento.equals("Separacion")) {
            DenominacionDoc = "   Separa   ";
            DenominacionDoc = "DETALLE DE SEPARADO";
        }
        if (documento.equals("Nota de Venta")) {
            DenominacionDoc = "NOTA DE VENTA";
        }
        if (documento.equals("Nota de Debito")) {
            DenominacionDoc = "NOTA DE DEBITO";
        }
        if (documento.equals("Nota de Credito")) {
            DenominacionDoc = "NOTA DE CREDITO";
            DenominacionDoc = "DEVOLUCION DE VENTA";
        }
        if (documento.equals("Factura de Compras")) {
            DenominacionDoc = "FACTURA DE COMPRAS";
            DenominacionDoc = "DETALLE DE COMPRA";
        }
        if (documento.equals("Devolucion en Compras")) {
            DenominacionDoc = "DEVOLUCION EN COMPRAS";
            DenominacionDoc = "DEVOLUCION DE COMPRA";
        }
        //genero los numeros de factura
        int contador = num_Fact.length();
        contador = 7 - contador;
        for (int i = 0; i < contador; i++) {
            num_Fact = "0" + num_Fact;
        }

        int contadorNE = codEmpresa.length();
        contadorNE = 3 - contadorNE;
        for (int i = 0; i < contadorNE; i++) {
            codEmpresa = "0" + codEmpresa;
        }

        int contadorNT = codTerminale.length();
        contadorNT = 3 - contadorNT;
        for (int i = 0; i < contadorNT; i++) {
            codTerminale = "0" + codTerminale;
        }
        //String codEmpresa,String codTerminale
        //String NumFactura="001-001-"+num_Fact;
        String NumFactura = codEmpresa + "-" + codTerminale + "-" + num_Fact;
        cabecera = "" + NombreRS + "\n" +
                "          Ruc:" + RucEmisor + "\n" +
                DireccionLocal + "\n" +
                "   AutSRI:" + AutSRI + " F.CAD:" + FechaCaducidad + "\n" +
                "            " + DenominacionDoc + "\n" +
                "         No.:" + NumFactura + "\n";

        //Para los locales Sexylocuras:
        cabecera= "            \n" +
                  "            " + DenominacionDoc + "\n" +
                  "         No.:" + NumFactura + "\n" +
                  "Emite:"+NombreRS+"\n" +
                  "Dir:"+DireccionLocal + "\n";

        //Datos del Cliente:

        String Fecha = fecha+" "+hora;
        // String FormaPago="Contado";
        cabecera = cabecera +
                "Nom:" + ClienteNom + "\n" +
                "Dir:" + ClienteDir + "\n" +
                "Tlf.:" + ClienteTlf + "\n" +

                Fecha + " " + "";
        //############################
        
        
        return cabecera;
    }
    
    public String pongoTitulos(String facturaTXT){
        facturaTXT = facturaTXT +
                "=====================================\n" +
                "Item      Nombre      Cant  Prec  Sub\n" +
                "=====================================";
       return facturaTXT;
    }
    
    String abonos="0";
    public String pieFactura(String Subtotal, String Descuento, String Iva, String total) {
        String Pie = "";
        double Sub_Desc = Double.parseDouble(Subtotal) - Double.parseDouble(Descuento);
        if (documento.equals("Factura")) {
            Pie = "=====================================\n" +
                    "Subtotal   =" + Subtotal + "\n" +
                    "Descuento  =" + Descuento + "\n" +
                    "Sub-Desc  =" + nf.format(Sub_Desc).replaceAll(",",".") + "\n" +
                    "Iva        =" + Iva + "\n" +
                    "Abonos     =" + abonos + "\n" +
                    "TOTAL PAG  =" + total;
        }
        if (documento.equals("Separacion")) {
            Pie = "=====================================\n" +
                    "Subtotal   =" + Subtotal + "\n" +
                    "Descuento  =" + Descuento + "\n" +
                    "Sub-Desc  =" + nf.format(Sub_Desc).replaceAll(",",".") + "\n" +
                    "Iva        =" + Iva + "\n" +
                    "Valor Total Separado =" + total;
        }
        if (documento.equals("Nota de Venta")) {
            Pie = "=====================================\n" +
                    "Descuento  =" + Descuento + "\n" +
                    "TOTAL PAG  =" + total;
        }
        if (documento.equals("Nota de Debito")) {
            Pie = "=====================================\n" +
                    "Subtotal   =" + Subtotal + "\n" +
                    "Iva        =" + Iva + "\n" +
                    "TOTAL PAG  =" + total;
        }
        if (documento.equals("Nota de Credito")) {
            Pie = "=====================================\n" +
                    "Subtotal   =" + Subtotal + "\n" +
                    "Iva        =" + Iva + "\n" +
                    "TOTAL PAG  =" + total;
        }
        if (documento.equals("Factura de Compras")) {
            Pie = "=====================================\n" +
                    "Subtotal   =" + Subtotal + "\n" +
                    "Descuento  =" + Descuento + "\n" +
                    "Sub-Desc  =" + nf.format(Sub_Desc).replaceAll(",",".") + "\n" +
                    "Iva        =" + Iva + "\n" +
                    "TOTAL PAG  =" + total;
        }
        if (documento.equals("Devolucion en Compras")) {
            Pie = "=====================================\n" +
                    "Subtotal   =" + Subtotal + "\n" +
                    "Descuento  =" + Descuento + "\n" +
                    "Iva        =" + Iva + "\n" +
                    "TOTAL PAG  =" + total;
        }

        //Pongo mensaje para el SRI
        Pie=Pie+this.mesajePromocion;
        Pie=Pie+"\nNo valido para declaracion en SRI.";


        return Pie;
    }

    public Archivo getArchivo() {
        return facturaTXT;
    }

    public void setArchivo(Archivo archivocp) {
        facturaTXT = archivocp;
    }
}


